#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

typedef struct 
{
    char *msg;
    int date;
} Result;

void fn () {
    // return;  // 不会结束线程
    // pthread_exit(NULL); // 线程终止,并指定返回值
}

void *red_thread(void *arg)  // char *
{

    fn();
    char code = *(char *)arg;
    printf("红玫瑰开始执行 code=%c \n", code);

    // 不断读取用户输入
    char input[20];
    while (1)
    {
        // 读取用户输入
        fgets(input, sizeof(input), stdin);
        // 如果输入的是r, 返回特定数据结束
        if(input[0]==code)
        {
            printf("红玫瑰结束执行\n");

            Result *result = malloc(sizeof(Result));
            result->msg = "红玫瑰去北京了";
            result->date = 15;

            // return result; // 线程函数中
            pthread_exit(result); // 线程终止,并指定返回值
        }
        else // 否则输出读到的数据
        {
            printf("红玫瑰读到数据: %s\n", input);
        }
    }
}

void *white_thread(void *arg)
{
    char code = *(char *)arg;
    printf("白玫瑰开始执行 code=%c \n", code);

    // 不断读取用户输入
    char input[20];
    while (1)
    {
        // 读取用户输入
        fgets(input, sizeof(input), stdin);
        // 如果输入的是r, 返回特定数据结束
        if(input[0]==code)
        {
            printf("白玫瑰结束执行\n");

            Result *result = malloc(sizeof(Result));
            result->msg = "白玫瑰去上海了";
            result->date = 16;

            return result;
        }
        else // 否则输出读到的数据
        {
            printf("白玫瑰读到数据: %s\n", input);
        }
    }
}


int main(int argc, char const *argv[])
{
    
    // 创建2个线程
    pthread_t red_pt, white_pt;
    char red_code = 'r';
    char white_code = 'w';
    pthread_create(&red_pt, NULL, red_thread, &red_code);
    pthread_create(&white_pt, NULL, white_thread, &white_code);

    // 等待2个线程执行完毕
    Result *red_result;
    Result *white_result;
    pthread_join(red_pt, (void **)&red_result);
    pthread_join(white_pt, (void **)&white_result);

    printf("main线程得到红玫瑰结局: %s, 日期：%d号 \n", red_result->msg, red_result->date);
    printf("main线程得到白玫瑰结局: %s, 日期：%d号 \n", white_result->msg, white_result->date);

    free(red_result);
    free(white_result);

    return 0;
}
